#include "gtest/gtest.h"
#include "../src/libraries/parser/parser.h"
#include "../src/libraries/robocup/datos.h"

using namespace std;

class ParserSeeTest : public testing::Test
{
public:
    string see;
    Parser par;
    virtual void SetUp()
    {
        see="(see 12 ((flag c) 38.1 -23) ((flag c b) 39.6 28) ((flag r t) 100.5 -29) ((flag r b) 89.1 12) ((flag g r b) 88.2 -5) ((goal r) 89.1 -9) ((flag g r t) 90 -14) ((flag p r b) 71.5 4) ((flag p r c) 72.2 -11) ((flag p r t) 79 -26) ((ball) 36.6 -23 0 0) ((line r) 87.4 89))";
        par.leerparentesis(see);
        par.leerespacios(see);
    }
    virtual void TearDown()
    {
    }
};



class ParserSenseTest : public testing::Test
{
public:
    string sense;
    Parser par;
    virtual void SetUp()
    {
        sense="(sense_body 1 (view_mode high normal) (stamina 8000 1) (speed 0) (kick 0) (dash 0) (turn 0) (say 0))";
        par.leerparentesis(sense);
        par.leerespacios(sense);
    }
    virtual void TearDown()
    {
    }
};

class ParserHearTest : public testing::Test
{
public:
    string hear;
    Parser par;
    virtual void SetUp()
    {
        hear="(hear 1454 referee kick_off_l)";
        par.leerparentesis(hear);
        par.leerespacios(hear);
    }
    virtual void TearDown()
    {
    }
};

class ParserInitTest : public testing::Test
{
public:
    string init;
    Parser par;
    virtual void SetUp()
    {
        init="(init l 1 before_kick_off)";
        par.leerparentesis(init);
        par.leerespacios(init);
    }
    virtual void TearDown()
    {
    }
};

TEST_F(ParserSeeTest,testParentesisSee)
{
    EXPECT_EQ(par.inicio.size(),12); /** La cadena see tiene 12 parentesis de apertura "(" que queremos leer */
    EXPECT_EQ(par.fin1.size(),12);   /** La cadena see tiene 12 parentesis de cierre ")" que queremos leer */
    EXPECT_EQ(par.fin2.size(),13);   /** La cadena see tiene 13 parentesis de cierre ")" que queremos leer, distintos a los de fin1 */
}

TEST_F(ParserSeeTest,testEspaciosSee)
{
    EXPECT_EQ(par.espacios.size(),63);/** La cadena see tiene 63 espacios " " que queremos reconocer */
}

TEST_F(ParserSenseTest,testParentesisSense)
{
    EXPECT_EQ(par.inicio.size(),7);  /** La cadena sense tiene 7 parentesis de apertura ")" que queremos leer */
    EXPECT_EQ(par.fin1.size(),0);    /** La cadena sense tiene 0 parentesis de cierre ")" que queremos leer, distintos a fin2 */
    EXPECT_EQ(par.fin2.size(),8);    /** La cadena sense tiene 8 parentesis de cierre ")" que queremos leer */
}

TEST_F(ParserSenseTest,testEspaciosSense)
{
    EXPECT_EQ(par.espacios.size(),17);/** La cadena sense tiene 17 espacios " " que queremos reconocer */
}

TEST_F(ParserHearTest,testParentesisHear)
{
    EXPECT_EQ(par.inicio.size(),1);
    EXPECT_EQ(par.fin1.size(),0);
    EXPECT_EQ(par.fin2.size(),2);
}

TEST_F(ParserHearTest,testEspaciosHear)
{
    EXPECT_EQ(par.espacios.size(),3);
    EXPECT_EQ(par.espacios.at(0),5);
    EXPECT_EQ(par.espacios.at(1),7);
    EXPECT_EQ(par.espacios.at(2),15);
}

TEST_F(ParserInitTest,testParentesisInit)
{
    EXPECT_EQ(par.inicio.size(),1);
    EXPECT_EQ(par.fin1.size(),0);
    EXPECT_EQ(par.fin2.size(),2);
}

TEST_F(ParserInitTest,testEspaciosInit)
{
    EXPECT_EQ(par.espacios.size(),3);

}
int main(int argc, char **argv)
{
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
